/*
 *  LogService.java
 * 
 *  Yaoyong Li 22/03/2007
 *
 *  $Id: LogService.java, v 1.0 2007-03-22 12:58:16 +0000 yaoyong $
 */
package gate.learning;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * Write the learning information into a log file, which name is specified in
 * ConstantParameters.java. Also including a static variable debug determining
 * the level of output of the ML Api.
 */
public class LogService {
    //-------------------- Verbosity Level --------------------

    /** The Minimum level, only output the error and warning information. */
    public static final int MINIMUM = 0;
    /** The normal level, outputing the setting information and results. */
    public static final int NORMAL = 1;
    /** Output the debug information. */
    public static final int DEBUG = 2;
    /**
     * Determine if or not printing the information. 0 -- no debug information; 1 --
     * usual information output; 2 -- all the information output, including some
     * warning information.
     */
    /** The minimal verbosity level. Message below this level are ignored. */
    public static int maxVerbosityLevel = 1;
    /** The PrintStream to write the messages to. */
    private static PrintWriter logFileIn = null;
    /** The last printed message. */
    private static String lastMessage;
    /** Counts how often a message was repeated. */
    private static int equalMessageCount;

    /** Open the log service and set the minimum verbosity level. */
    public static void init(File logfile, boolean append, int verboLevel) throws IOException {
        logFileIn = new PrintWriter(new FileWriter(logfile, append));
        maxVerbosityLevel = verboLevel;
    }

    /** Closes the log stream. */
    public static void close() {
        //logMessage("Ended logging", INIT);
        logFileIn.close();
    }

    /** Writes the message to the output stream if the verbosity level is high enough. */
    public static void logMessage(String message, int verbosityLevel) {
        if (message == null) {
            return;
        }
        if (verbosityLevel > maxVerbosityLevel) {
            return;
        }
        if (message.equals(lastMessage)) {
            equalMessageCount++;
            return;
        }
        if (equalMessageCount > 0) {
            logFileIn.println("Last message repeated " + equalMessageCount + " times.");
            equalMessageCount = 0;
        }
        lastMessage = message;
        logFileIn.println(getTime() + " " + message);
        logFileIn.flush();
    }

    //-------------------- private helper methods --------------------
    /** Returns the current system time nicely formatted. */
    private static String getTime() {
        return java.text.DateFormat.getDateTimeInstance().format(new Date()) + ":";
    }
}
